package com.haolp.sys.service.impl;

import com.haolp.sys.common.exception.ServiceException;
import com.haolp.sys.common.vo.PageObjectVO;
import com.haolp.sys.common.vo.RoleCheckBoxVo;
import com.haolp.sys.common.vo.SysRoleMenuVO;
import com.haolp.sys.dao.SysRoleDao;
import com.haolp.sys.dao.SysRoleMenuDao;
import com.haolp.sys.dao.SysUserRoleDao;
import com.haolp.sys.pojo.SysRole;
import com.haolp.sys.service.SysRoleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import javax.swing.*;
import java.util.List;

/**
 * @author 小李
 * @version 1.0
 * @date 2021/10/11 10:27
 */
@Service
public class SysRoleServiceImpl implements SysRoleService {
    @Autowired
    private SysRoleDao sysRoleDao;
    @Autowired
    private SysRoleMenuDao sysRoleMenuDao;
    @Autowired
    private SysUserRoleDao sysUserRoleDao;

    @Override
    public PageObjectVO<SysRole> findPageObjects(String username, Integer pageCurrent) {
        //1.验证参数合法性
        if (pageCurrent == null || pageCurrent < 1)
            throw new IllegalArgumentException("当前页码值不正确");
        //2.基于条件查询总记录数
        //2.1执行查询
        int rowCount = sysRoleDao.getRowCount(username);
        //3.基于条件查询当前页面记录
        //3.1
        int pageSize = 3;
        int staetIndex = (pageCurrent - 1) * pageSize;
        //执行当前页数据查询
        List<SysRole> records = sysRoleDao.findPageObjects(username, staetIndex, pageSize);
        //4.对分页信息和当前页记录进行封装
        PageObjectVO<SysRole> pageObjectVO = new PageObjectVO<>
                (pageCurrent, pageSize, rowCount, records);
        return pageObjectVO;
    }


    @Override
    public int saveObject(SysRole entity, Integer[] menuIds) {
        //1.参数效验
        if (entity == null)
            throw new IllegalArgumentException("保存对象不能为空");
        if (StringUtils.isEmpty(entity.getName()))
            throw new IllegalArgumentException("角色名不能为空");
        if (menuIds == null || menuIds.length == 0)
            throw new ServiceException("必须为角色分配权限");
        //2.保存角色自身信息
        int rows = sysRoleDao.insertObject(entity);
        //3.保存角色和菜单关系的数据
        sysRoleMenuDao.insertObjects(entity.getId(), menuIds);
        //4.返回结果
        return rows;
    }


    @Override
    public List<RoleCheckBoxVo> findObjects() {
        return sysRoleDao.findObjects();
    }

    @Override
    public SysRoleMenuVO findObjectById(Integer id) {
        //1.参数合法性效验
        if(id==null || id<=0)
            throw new IllegalArgumentException("id值不合法");
        //2.基于Id查询数据
        //2.1查询角色自身信息
        //2.2查询角色对应的菜单id
        SysRoleMenuVO sysRoleMenuVO=sysRoleDao.findObjectById(id);
        //3.验证结果并返回
        if(sysRoleMenuVO==null)
            throw new ServiceException("记录不存在");
        return sysRoleMenuVO;
    }

    @Override
    public int updateObject(SysRole entity, Integer[] menuIds) {
        //参数校验
        if (entity==null)
            throw new IllegalArgumentException("对象更新不能为空");
        if (StringUtils.isEmpty(entity.getName()))
            throw new IllegalArgumentException("角色名不能为空");
        if (menuIds==null || menuIds.length==0)
            throw new IllegalArgumentException("必须为角色分配权限");
        //2.更新角色信息
        //2.1
        int rows=sysRoleDao.updateObject(entity);
        sysRoleMenuDao.deleteObjectsByRoleId(entity.getId());
        sysRoleMenuDao.insertObjects(entity.getId(),menuIds);
        return rows;

    }

    @Override
    public int deleteObject(Integer id) {
        //1.参数校验
        if (id==null || id<1)throw new IllegalArgumentException("id值无效");
        //2.执行删除
        //2.1删除的是角色和用户之间的关系数据
        sysUserRoleDao.deleteObjectsByRoleId(id);
        //2.2删除角色和菜单的关系数据
        sysRoleMenuDao.deleteObjectsByRoleId(id);
        //2.3删除角色自身的的数据
        int rows =sysRoleDao.delectObject(id);
        //3.返回结果
        return rows;
    }
}
